#pragma once

#include <bofcl_csr_r.h>

// mstatus寄存器的定义
typedef struct {
	u32_s : 3;
	u32_s MIE : 1;
	u32_s : 3;
	u32_s MPIE : 1;
	u32_s : 3;
	u32_s MPP : 2;
	u32_s FS : 2;
	u32_s XS : 2;
	u32_s : 14;
	u32_s SD : 1;
} csr_mstatus_s;

_Static_assert(sizeof(csr_mstatus_s) == 4,
	       "Struct csr_mstatus_s defined error!");

// 将mstatus寄存器的给定位置为1
static inline void csr_hreg_mstatus(csr_mstatus_s mstatus_high) {
	union {
		csr_mstatus_s m;
		u32_s u;
	} mu = {
		.m = mstatus_high,
	};
	csr_hreg(CSR_MSTATUS, mu.u);
}

// 将mstatus寄存器的给定位置为0
static inline void csr_lreg_mstatus(csr_mstatus_s mstatus_low) {
	union {
		csr_mstatus_s m;
		u32_s u;
	} mu = {
		.m = mstatus_low,
	};
	csr_lreg(CSR_MSTATUS, mu.u);
}
